/*******************************************************************************
 * \brief	在8051工程中打印hello world
 * \note	参考资料
 *			[keil C51 重定向printf到串口]
 *			(https://blog.csdn.net/Wekic/article/details/77418443)
 * \note	File format: UTF-8
 * \author	将狼才鲸
 * \date	2022-10-29
 ******************************************************************************/

/********************************** 头文件 ************************************/
#include <reg51.h> /* 8051通用寄存器 */
#include <stdio.h> /* printf */

/******************************** 接口函数 ************************************/
/**
 * \brief		printf重定向的函数，这里重定向到串口0
 * \param[in]	c	承接printf中传入的一个字符
 * \note		这里的函数注释格式是Doxygen，有兴趣的可以自行去了解
 * \return		正常时返回c，错误时返回错误码
 */
char putchar(char c)
{
	/* 空格和行尾注释使用Linux风格 */
	ES = 0;				/* 关串口中断 */
	SBUF = c;           
	while (TI != 1);	/* 等待发送成功 */
	TI = 0;				/* 清除发送中断标志 */
	ES = 1;				/* 开串口中断 */

	return c;
}

/**
 * \brief	程序C语言的入口，程序最开始的入口在汇编文件中
 * \details	为什么main()函数后面的括号里面是空的，而没有写void？
 *			因为main函数的实际格式是int main(int argc, char *argv[]),
 *			而因为没有操作系统的嵌入式程序中都不会传入参数，所以把这个参数省略了，
 *			8051的话，你在参数里写上void也是不会报错的，但有操作系统时会报错
 */
int main()
{
	/* 这里省掉了串口0的初始化，仿真运行时默认是已经配好的 */

	printf("Hello world!\n");

	while(1); // 不加上死循环的话，程序执行完会默认上电重新执行，循环执行main()函数，导致输出窗口刷屏

	//return 0;
}

/********************************** 文件尾 ************************************/
